package com.jueyue.dao.resource;

import java.io.StringWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;

import com.jueyue.dao.util.ClassNameUtil;

import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 所有的SQL 资源用来存放 sql的Cache 及其模板解析
 * 
 * @author jueyue 2013年8月9日
 */
public class SQLResource {

	private static final Configuration config = new Configuration();

	private static final StringTemplateLoader loader = new StringTemplateLoader();

	static {
		config.setEncoding(Locale.CHINA, "UTF-8");
		config.setTemplateLoader(loader);
	}

	/**
	 * 根据类名和方法名获取 动态 SQL
	 * 
	 * @return SQL
	 */
	public static String getSql() {
		return getSql(getMethodUrl(), null);
	}

	/**
	 * 根据类名和方法名获取 动态 SQL
	 * 
	 * @return SQL
	 */
	public static String getSql(String key) {
		return getSql(key, null);
	}

	/**
	 * 根据类名和方法名获取 动态 SQL
	 * 
	 * @param map
	 *            freemarks 的 rootMap
	 * @return SQL
	 */
	public static String getSql(Map<String, Object> map) {
		return getSql(getMethodUrl(), map);
	}

	/**
	 * 根据KEY获取 动态 SQL
	 * 
	 * @param map
	 *            freemarks 的 rootMap
	 * @return SQL
	 */
	public static String getSql(String key, Map<String, Object> map) {
		try {
			Template template = config.getTemplate(key);
			if (template == null) {
				throw new RuntimeException(key + "---------不存在该Key");
			}
			Writer write = new StringWriter();
			template.process(map, write);
			String sql = write.toString();
			return sql;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 返回上一步执行的方法路径
	 * 
	 * @return
	 */
	private static String getMethodUrl() {
		StringBuffer sb = new StringBuffer();
		StackTraceElement[] stacks = new Throwable().getStackTrace();
		sb.append(getRealClassName(stacks[2].getClassName())).append(".")
				.append(stacks[2].getMethodName());
		return sb.toString();
	}

	private static String getRealClassName(String className) {
		return ClassNameUtil.getImplRealName(className.substring(className
				.lastIndexOf(".") + 1));
	}

	public static StringTemplateLoader getLoader() {
		return loader;
	}

}
